// 双向队列对象接口
import { ObjectQueue } from './队列（对象实现）';

// 双向队列类--->基于继承实现
export class ObjectDeque<T> extends ObjectQueue<T> {
    // 构造函数
    constructor() {
        super();
    }
    // 向队首添加元素
    addToHead(item: T): void {
        // 队首元素为空时
        if (this.isEmpty()) {
            this.enqueue(item);
            // 队首元素大于0时
        } else if (this.headIndex > 0) {
            this.headIndex--;
            this.queue[this.headIndex] = item;
            // 最复杂的情况，队首元素为零，需要所有元素往后挪一位
        } else if (this.headIndex === 0) {
            for (let i = this.tail; i > 0; i--) {
                this.queue[i] = this.queue[i - 1];
            }
            this.queue[this.headIndex] = item;
            this.tail++;// 队尾指针别忘了+1
        }
    }
    // 队尾出队元素
    pop(): T | undefined {
        if (this.isEmpty()) return undefined;
        this.tail--;
        const res = this.queue[this.tail];
        delete this.queue[this.tail];
        return res;
    }
    // 返回队尾元素
    peekBack(): T | undefined {
        if (this.isEmpty()) return undefined;
        return this.queue[this.tail - 1];
    }
}

// 测试用例

const deque = new ObjectDeque();
console.log(deque.clear(),deque.peek(),deque.pop(),deque.peekBack());
// 队列为空的情况下，往队首添加元素
deque.addToHead("队首添加元素");
console.log(deque.peek());

// 队尾添加元素
deque.enqueue("队尾添加元素");
console.log(deque.peekBack());

// 队首元素等于0的情况往队首添加元素
deque.addToHead("队首元素等于0添加元素");
console.log(deque.peek());

// 队首元素大于0，往队首添加元素
deque.dequeue();
deque.addToHead("队首元素大于0添加元素");
console.log(deque.peek());

// 获取队列大小
console.log("队列大小:", deque.length())

// 队列末尾添加元素
deque.enqueue("队列末尾添加元素")

// 获取队列中的所有元素
console.log("队列中的所有元素: ", deque.stringfy())

// 移除队首元素
deque.dequeue();

// 移除队尾元素
deque.pop();

// 获取队首元素
console.log("队首元素: ", deque.peek());

// 获取队尾元素
console.log("队尾元素: ", deque.peekBack());
